今天要再來在敵人 AI 上動手腳了,這次要加上攻擊,不然人現在就走來走去,沒有挑戰性。因為我沒有現成的攻擊動畫,我就直接用 Timeline 來K動畫了。
BTTask_Attack.cpp
加上攻擊邏輯
EBTNodeResult::Type UBTTask_Attack::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
// 取得控制的 Pawn
AAIController* AICon = OwnerComp.GetAIOwner();
ACharacter* Enemy = Cast<ACharacter>(AICon->GetPawn());
AActor* Target = Cast<AActor>(OwnerComp.GetBlackboardComponent()->GetValueAsObject("Target"));
if (!Enemy || !Target) return EBTNodeResult::Failed;
FOutputDeviceNull ar;
Enemy->CallFunctionByNameWithArguments(TEXT("DoAttack"), ar, nullptr, true);
return EBTNodeResult::Succeeded;
}
這裡懶了一點,就直接呼叫 Blueprint 裡的 Custom Event (DoAttack)。
Enemy
這裡是簡單的製作武器揮動動畫 (用 Timeline) 與攻擊判定,一般正式做遊戲還是單獨做攻擊動作比較好。
Player
玩家受擊後扣除血量並撥放畫面震動
血量條跟上次敵人的一樣,創建一個 User Interface Widget,並 Bind Progress Percent,然後在 Event Begin play 創建 Widget,並設定
Enemy Behavior Tree